package com.molichuxing.gateway.api.services;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.molichuxing.gateway.bff.car.entity.request.create.MaintenanceConfigCreateVo;
import com.molichuxing.gateway.bff.car.entity.request.modify.*;
import com.molichuxing.gateway.bff.car.entity.response.*;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.framework.result.ResponseResult;
import com.molichuxing.gateway.bff.car.entity.request.create.AccidentExamineCreateVo;
import com.molichuxing.gateway.bff.car.entity.request.create.CarLicencePlateCreateVo;
import com.molichuxing.gateway.bff.car.entity.request.create.MaintenanceLogCreateVo;

/**
 * 车辆信息web接口
 */
public interface VehicleApiService {

    /**
     * 车辆检验
     *
     * @param selectParams
     * @return
     */
    ResponseResult<Paged<CarCheckVo>> getCarCheckList(Map<String, Object> selectParams);

    /**
	 *
	 * @param checkId
	 *            检验详情基础信息
     * @return
     */
    ResponseResult<CarBasicVo> getCheckBasicInfo(Integer checkId);

    /**
     * 根据检验id 获取检验详情
     *
     * @param checkId
     * @return
     */
    ResponseResult<CheckVo> getCheckNewInfo(Integer checkId);

    /**
     * 根据检验id 获取PDI检验信息检验详情
     *
     * @param checkId
     * @return
     */
    ResponseResult<PdiCheckVo> getPdiCheckNewInfo(Integer checkId);

    /**
     * 根据车辆检验id 获取检验图片信息
     *
     * @param checkId
     * @return
     */
    ResponseResult<CheckImageVo> getCheckImageInfo(Integer checkId);

    /**
     * 根据检验id 获取车辆整备信息
     *
     * @param checkId
     */
    ResponseResult<CheckPreparationVo> getCheckPreparationInfo(Integer checkId);

    /***
     * 新车验车
     *
     * @param checkModifyVo
     * @return
     * @throws Exception
     */
    ResponseResult<Boolean> checkCar(CheckModifyVo checkModifyVo) throws Exception;

    /**
     * 获取PDI检验车辆检验列表
     *
     * @param selectParams
     * @return
     */
    ResponseResult<Paged<CarCheckVo>> getPdiCarCheck(Map<String, Object> selectParams);

    /***
     * PDI 验车
     *
     * @param pdiCheckModifyVo
     * @return
     * @throws Exception
     */
    ResponseResult<Boolean> pdiCheckCar(PdiCheckModifyVo pdiCheckModifyVo) throws Exception;

    /***
     * PDI 检验争议处理
     *
     * @param disPdiCheckModifyVo
     * @return
     * @throws Exception
     */
    ResponseResult<Boolean> discussPdiCheck(DisPdiCheckModifyVo disPdiCheckModifyVo) throws Exception;

    /***************** 车牌 开始 *******************************************/
    /**
     * 根据车辆id获取车牌信息
     *
     * @param carId
     * @return
     * @throws Exception
     */
    public ResponseResult<CarLicencePlateDetailVo> getLicencePlate(int carId) throws Exception;

    /**
     * 新增车牌信息
     *
     * @param createVo
     * @return
     * @throws Exception
     */
    public ResponseResult<Integer> createLicencePlate(CarLicencePlateCreateVo createVo) throws Exception;

    /**
     * 编辑车牌信息
     *
     * @param modifyVo
     * @return
     * @throws Exception
     */
    public ResponseResult<Integer> modifyLicencePlate(CarLicencePlateModifyVo modifyVo) throws Exception;

    /***************** 车牌 结束 *******************************************/

    /***************** 年检 开始 *******************************************/
    /**
     * 根据查询条件获取年检列表信息
     *
     * @param yearlyInspectStatus
     * @param licencePlate
     * @param vin
     * @param addressType
     * @param addressId
     * @param inspectStartDate
     * @param inspectEndDate
     * @param pageNum
     * @param pageSize
     * @return
     */
    public ResponseResult<Paged<CarYearlyInspectVo>> getYearlyInspect(int yearlyInspectStatus, String licencePlate,
                                                                      String vin, Integer addressType, Integer addressId, String inspectStartDate, String inspectEndDate,
                                                                      Integer handleStatus,String sortName, String sortWay, Integer pageNum, Integer pageSize);

    /**
     * 根据车辆id获取年检信息
     *
     * @param carId
     * @return
     */
    public ResponseResult<YearlyInspectionVo> getYearlyInspectionByCarId(Integer carId);

    /**
     * 编辑年检信息
     *
     * @param modifyDto
     * @return
     */
    public ResponseResult<Boolean> modifyYearlyInspection(YearlyInspectionModifyVo modifyDto, BindingResult bindingResult);

    /**
     * 年检记录
     *
     * @param carId
     * @return
     */
    public ResponseResult<List<YearlyInspectionLogVo>> getYearlyInspectionLog(Integer carId);

    /***************** 年检 结束 *******************************************/

    /***************** 保险 开始 *******************************************/

    /**
     * 根据条件分页查询交强险信息 code 保单号 licencePlate 车牌 vin 车架号 insuranceCompanyId 保险公司ID
     * insureStartTime 投保开始时间 insureEndTime 投保结束时间 beginStartTime 起保开始时间
     * beginEndTime 起保结束时间 endStartTime 终保开始时间 endEndTime 终保结束时间
     *
     * @param mapParam
     * @param pageNum
     * @param pageSize
     * @return
     */
    public ResponseResult<Paged<CarInsuranceVo>> getCompulsoryInsurancePage(Map<String, Object> mapParam, Integer pageNum,
                                                                  Integer pageSize);



    /**
     * 根据条件分页查询交强险信息 code 保单号 licencePlate 车牌 vin 车架号 insuranceCompanyId 保险公司ID
     * insureStartTime 投保开始时间 insureEndTime 投保结束时间 beginStartTime 起保开始时间
     * beginEndTime 起保结束时间 endStartTime 终保开始时间 endEndTime 终保结束时间
     *
     * @param mapParam
     * @param pageNum
     * @param pageSize
     * @return
     */
    public ResponseResult<Paged<CarInsuranceVo>> getCommercialInsurancePage(Map<String, Object> mapParam, Integer pageNum,
                                                                  Integer pageSize);

    /**
     * 根据保险ID查询保险信息
     *
     * @param insuranceId
     * @return
     */
    public ResponseResult<CarInsuranceDetailVo> getInsuranceById(int insuranceId);

    /**
     * 根据交强险ID修改交强险信息
     *
     * @param modifyDto
     * @return
     */
    public ResponseResult<Boolean> modifyCompulsoryInsurance(CarCompulsoryInsuranceModifyVo modifyDto);

    /**
     * 根据商业险ID修改商业险信息
     *
     * @param modifyDto
     * @return
     */
    public ResponseResult<Boolean> modifyCommercialInsurance(CarCommercialInsuranceModifyVo modifyDto);

    /***************** 保险 结束 *******************************************/

    /***************** 车辆 开始 *******************************************/

    /**
     * 根据条件查询车辆列表
     *
	 * @param selectParams
	 *            licencePlate(车牌) vin（车架号） vehicleId（车型）
     *                     purchaseStartDate（采购开始时间） purchaseEndDate（采购结束时间）
     *                     stockId（仓库id） vehicleType（车辆类型） status（运营状态） plateStatus（上牌状态）
     * @param pageSize
     * @param pageNum
     * @return
     */
    public ResponseResult<Paged<CarVo>> getCarList(Map<String, Object> selectParams, Integer pageNum, Integer pageSize);

    /**
     * 根据条件查询车辆列表
     *
     * @param selectParams
     *            licencePlate(车牌) vin（车架号） vehicleId（车型）
     *                     purchaseStartDate（采购开始时间） purchaseEndDate（采购结束时间）
     *                     stockId（仓库id） vehicleType（车辆类型） status（运营状态） plateStatus（上牌状态）
     * @param pageSize
     * @param pageNum
     * @return
     */
    public ResponseResult<Paged<CarVo>> getCarPlateList(Map<String, Object> selectParams, Integer pageNum, Integer pageSize);

    /**
     * 根据vin获取车辆轨迹的时间段
     *
     * @param vin
     * @return
     */
    public ResponseResult<List<String>> getTrajectoryTime(String vin);

    /**
     * 根据vin获取车辆轨迹
     *
     * @param vin
     * @return
     */
    public ResponseResult<List<IovTrajectoryVo>> getTrajectory(String vin, String startTime, String endTime);

    /**
     * 根据车辆id修改车辆详细信息
     *
     * @param modifyDto
     * @return
     */
    public ResponseResult<Boolean> modifyCarDetail(CarDetailModifyVo modifyDto);

    /**
     * 根据车辆id获取车辆详细信息
     *
     * @param carId
     * @return
     */
    public ResponseResult<CarDetailVo> getCarDetail(Integer carId);

    /**
     * 根据车辆Id获取保险信息
     *
     * @param carId
     * @param type
     * @return
     */
    public ResponseResult<List<CarInsuranceVo>> getInsuranceList(Integer carId, Integer type);

    /**
     * 根据车辆id获取事故报备信息
     *
     * @param carId
     * @return
     */
    public ResponseResult<List<AccidentBizVo>> getCarAccidentList(Integer carId);

    /**
     * 根据车辆id获取检验信息
     *
     * @param carId
     * @return
     */
    public ResponseResult<List<CarCheckVo>> getCarCheckListByCarId(Integer carId);

    /**
     * 根据车辆id获取违章信息
     *
     * @param carId
     * @return
     */
    public ResponseResult<List<CarsViolationVo>> getViolationListByCarId(Integer carId);

    /**
     * 根据车辆id获取保养信息
     *
     * @param carId
     * @return
     */
    public ResponseResult<List<MaintenanceRecordVo>> getMaintenanceByCarId(Integer carId);

    /**
     * 上传车辆excel文件
     *
     * @param excelFile
     * @return
     */
    public ResponseResult<Boolean> uploadVehicleFile(MultipartFile excelFile);

    /**
     * 上传车辆的图片zip包
     *
     * @param purchaseInvoiceFile
     * @param factoryCertificateFile
     * @param conformityCertificateFile
     * @return
     */
    public ResponseResult<Boolean> uploadVehicleImgZip(MultipartFile purchaseInvoiceFile,
                                                       MultipartFile factoryCertificateFile, MultipartFile conformityCertificateFile);

    /***************** 车辆 结束 *******************************************/

    /***************** 车辆事故 开始 *******************************************/
    /**
     * 根据查询条件获取车辆事故列表信息 * licencePlate 车牌号 * vin 车架号 * userId 用户id *
     * liabilityType 责任类型（0：无责，1：全责，2：主责，3：同责，4：次责） * isCasualty
     * 是否有人伤（0：无人伤，1：有人伤） * accidentType
     * 事故类型（1:单方事故，2：双方事故，3：多方事故，4：停放受损，5：车辆盗抢，6：车辆自燃，7：车辆涉水，8：重大自然灾害） *
     * accidentStartTime 出险开始时间 * accidentEndTime 出险结束时间 * status
     * 事故状态（1：事故未确认，2：事故已确认，3：结案未确认，4：已结案，5：无效报备）
     *
     * @param map
     * @param pageSize
     * @param pageNum
     * @return
     */
    ResponseResult<Paged<AccidentBizVo>> getCarAccidentPage(Map<String, Object> map, Integer pageNum, Integer pageSize);

    /**
     * 根据事故id获取事故信息
     *
     * @param accidentId
     * @return
     * @throws Exception
     */
    ResponseResult<AccidentDetailVo> getAccident(Integer accidentId) throws Exception;

    /**
     * 验证事故、结案是否重复提交
     *
     * @param accidentId
     * @return
     * @throws Exception
     */
    ResponseResult<AccidentVerifyBizVo> verifyRepeat(Integer accidentId, Integer version) throws Exception;

    /**
     * 审核事故
     *
     * @param createDto
     * @return
     * @throws Exception
     */
    ResponseResult<Boolean> modifyExamineAccident(AccidentExamineCreateVo createDto) throws Exception;

    /***************** 车辆事故 结束 *******************************************/

    /***************** 保养 开始 *******************************************/

    /**
     * 根据条件分页查询保养信息 type 保养类别：1-待保养，0-待审核，8-审核记录 licencePlate 车牌 vin 车架号
     * totalStartMileage 已行驶开始里程 totalEndMileage 已行驶结束里程 maintainableStartDate
     * 开始保养时间 maintainableEndDate 结束保养时间 purchaseStartDate 采购开始时间
     * purchaseEndDate 采购结束时间 checkStartDate 审核开始时间 checkEndDate 审核结束时间
     * examineStatus 审核状态 3-审核通过，4-审核驳回
     *
     * @param mapParam
     * @param pageNum
     * @param pageSize
     * @return
     */
    public ResponseResult<Paged<MaintenanceBizVo>> getMaintenancePage(Map<String, Object> mapParam, Integer pageNum,
                                                                      Integer pageSize);

    /**
     * 根据保养ID获取保养信息
     *
     * @param id
     * @return
     */
    public ResponseResult<MaintenanceDetailVo> getMaintenanceById(Integer id);

    /**
     * 根据保养ID获取保养信息
     *
     * @param id
     * @return
     */
    public ResponseResult<MaintenanceRecordVo> getMaintenanceRecordById(Integer id);

    /**
     * 创建保养历史
     *
     * @param MaintenanceLogCreateVo
     * @return
     */
    public ResponseResult<Boolean> createMaintenanceLog(MaintenanceLogCreateVo MaintenanceLogCreateVo);

    /**
     * 审核保养信息
     *
     * @param modifyVo
     * @return
     */
    public ResponseResult<Integer> modifyMaintenanceCheck(MaintenanceLogModifyVo modifyVo);

    /***************** 保养 结束 *******************************************/

    /**
     * 车辆违章列表
     *
     * @return
     */
    public ResponseResult<Paged<CarsViolationVo>> getCarsViolationPaged(Map<String, Object> params, Integer pageNum,
                                                                        Integer pageSize);

    /**
     * 交强险excel导入
     *
     * @param excelFile
     * @return
     */
    public ResponseResult<Boolean> uploadInsuranceExcelFile(MultipartFile excelFile);

    /**
     * 交强险pdf导入
     *
     * @param pdfFile
     * @return
     */
    public ResponseResult<Boolean> uploadInsurancePdfFile(MultipartFile pdfFile);

    /**
     * 商业险excel导入
     *
     * @param excelFile
     * @return
     */
    public ResponseResult<Boolean> uploadCommercialExcelFile(MultipartFile excelFile);

    /**
     * 商业险pdf导入
     *
     * @param pdfFile
     * @return
     */
    public ResponseResult<Boolean> uploadCommercialPdfFile(MultipartFile pdfFile);

    /**
     * 车辆列表导出
     *
     * @param request
     * @param response
     * @param selectParams
     */
    public void getCarListDownload(HttpServletRequest request, HttpServletResponse response,
                                   Map<String, Object> selectParams);

    /**
     * 车辆列表导出查询
     *
     * @param request
     * @param response
     * @param selectParams
     */
    public ResponseResult<Boolean> getCarListDownloadQuery(HttpServletRequest request, HttpServletResponse response,
                                                           Map<String, Object> selectParams);

    /**
     * 年检导出
     *
     * @param request
     * @param response
     * @param yearlyInspectStatus
     * @param licencePlate
     * @param vin
     * @param addressType
     * @param addressId
     * @param inspectStartDate
     * @param inspectEndDate
     */
    public void getYearlyInspectDownload(HttpServletRequest request, HttpServletResponse response,
                                         String inspectionIdList, int yearlyInspectStatus, String licencePlate, String vin, Integer addressType,
                                         Integer addressId, String inspectStartDate, String inspectEndDate);

    /**
     * 年检导出查询
     *
     * @param request
     * @param response
     * @param selectParams
     */
    public ResponseResult<Boolean> getYearlyInspectDownloadQuery(HttpServletRequest request,
                                                                 HttpServletResponse response, String inspectionIdList, int yearlyInspectStatus, String licencePlate,
                                                                 String vin, Integer addressType, Integer addressId, String inspectStartDate, String inspectEndDate);

    /**
     * 违章列表导出
     *
     * @param request
     * @param response
     * @param map
     */
    public void getCarsViolationDownload(HttpServletRequest request, HttpServletResponse response,
                                         Map<String, Object> map);

    /**
     * 违章列表导出查询
     *
     * @param request
     * @param response
     * @param map
     */
    public ResponseResult<Boolean> getCarsViolationDownloadQuery(HttpServletRequest request,
                                                                 HttpServletResponse response, Map<String, Object> map);

    /**
     * 事故管理导出
     *
     * @param request
     * @param response
     * @param map
     */
    public void getAccidentDownload(HttpServletRequest request, HttpServletResponse response, Map<String, Object> map);

    /**
     * 事故管理导出查询
     *
     * @param request
     * @param response
     * @param map
     */
    public ResponseResult<Boolean> getAccidentDownloadQuery(HttpServletRequest request, HttpServletResponse response,
                                                            Map<String, Object> map);

    /**
     * 交强险列表导出
     *
     * @param request
     * @param response
     * @param map
     */
    public void getInsuranceListDownload(HttpServletRequest request, HttpServletResponse response,
                                         Map<String, Object> map);

    /**
     * 交强险列表导出查询
     *
     * @param request
     * @param response
     * @param map
     */
    public ResponseResult<Boolean> getInsuranceListDownloadQuery(HttpServletRequest request,
                                                                 HttpServletResponse response, Map<String, Object> selectParams);

    /**
     * 获取围栏异常的列表
     *
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    public ResponseResult<Paged<CarsFenceExceptionVo>> getCarsFenceExceptionPaged(Map<String, Object> params,
                                                                                  Integer pageNum, Integer pageSize);

    /**
     * 根据主键id查询围栏异常
     *
     * @param id
     * @return
     */
    public ResponseResult<CarsFenceExceptionDetailVo> getCarsFenceExceptionDetail(Integer id);


    /**
     * 失联报警
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    ResponseResult<Paged<OfflineAlarmVo>> getOfflineAlarmVoList( Map<String, Object> params, Integer pageNum, Integer pageSize);


    /**
     * 里程异变报警
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    ResponseResult<Paged<MileageExAlarmsVo>> getMileageExAlarmsList( Map<String, Object> params, Integer pageNum, Integer pageSize);


    /**
     * 使出仓库报警
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    ResponseResult<Paged<WarehouseAlarmVo>> getWarehouseAlarmList( Map<String, Object> params, Integer pageNum, Integer pageSize);


    /**
     * 使驶出报警
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    ResponseResult<Paged<WarehouseAlarmVo>> getStoresAlarmList(Map<String, Object> params, Integer pageNum, Integer pageSize);


    /**
     * 驶入非法区域报警
     * @param params
     * @param pageNum
     * @param pageSize
     * @return
     */
    ResponseResult<Paged<IllegalAlarmVo>> getIllegalAlarmList(Map<String, Object> params, Integer pageNum, Integer pageSize);


    /**
     *  下发控车命令
     * @param params
     * @return
     */
     ResponseResult sendControlCommand(@RequestParam Map<String, Object> params);

    /**
	 * 违章标记接口
	 * @param modifyVo
	 * @return
	 */
	ResponseResult<Boolean> modifyViolationStatusById(CarsViolationModifyVo modifyVo);


	/**
	 * 企业订单添加车辆检验接口
	 * @param vin
	 * @return
	 */
	ResponseResult<CarVo> getEnterpriseVerify(String vin, Integer vehicleId);

    /**
     * 获取车辆里程
     *
     * @param vin
     * @return
     */
    ResponseResult<Integer> getCarOdoMileage(String vin);

    /**
     * 获取配置列表
     *
     * @return
     */
    public ResponseResult<List<WarnConfigVo>> getWarnConfigList();

    /**
     * 编辑配置
     *
     * @param list
     * @return
     */
    public ResponseResult<Boolean> modifyWarnConfig(List<WarnConfigModifyVo> list);

    /**
     * 分页
     * @param map
     * @param pageNum
     * @param pageSize
     * @return
     */
    public ResponseResult<Paged<MaintenanceConfigVo>> getMaintenanceConfigPage(Map<String, Object> map, Integer pageNum, Integer pageSize);

    /**
     * 查询
     *
     * @param id
     * @return
     */
    public ResponseResult<MaintenanceConfigVo> getMaintenanceConfig(Integer id);

    /**
     * 添加
     *
     * @param dto
     * @return
     */
    public ResponseResult<Boolean> createMaintenanceConfig(MaintenanceConfigCreateVo dto);

    /**
     * 修改
     *
     * @param dto
     * @return
     */
    public ResponseResult<Boolean> modifyMaintenanceConfig(MaintenanceConfigModifyVo dto);
    
    

	/**
	 * 车辆违章 获取根据车架号 获取车牌号信息
	 * @param vin
	 * @return
	 */
	ResponseResult<CarVo> getCarByVin(String vin);

	/**
	 * 获取车辆违章(根据车辆vin查询违章信息)
	 * @param params
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	ResponseResult<Paged<CarsViolationVo>> getCarsViolationQueryPaged(Map<String, Object> params, Integer pageNum,
			Integer pageSize);
    

}
